package com.mgblog.dao.imp;

import java.io.Serializable;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
/**
 * spring中hibernate的工具类。
 * @author Administrator
 *
 */
@Transactional
public abstract class BaseDao {
	@Resource
	private SessionFactory sessionFactory;
	/**
	 * 删除实体对象
	 * @param obj
	 */
	public void delete(Object obj) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().delete(obj);
	}
	/**
	 * 统一的hql查询语句
	 * @param hql hql语句
	 * @param paras hql需要的参数
	 * @return 查询得到的list集合
	 */
	@SuppressWarnings("unchecked")
	public List executeQuery(String hql, Object[] paras) {
		// TODO Auto-generated method stub
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		if(paras!=null&&paras.length!=0){
			for(int i=0;i<paras.length;i++){
				query.setParameter(i, paras[i]);
			}
		}
		query.setCacheable(true);
		return query.list();
	}
	/**
	 * 通过id查询得到一个对象
	 * @param clazz 该对象对应的Class
	 * @param id 对象的id
	 * @return	返回查询得到对象
	 */
	@SuppressWarnings("unchecked")
	public Object findById(Class clazz, Serializable id) {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().load(clazz, id);
	}
	/**
	 * 保存一个对象到数据库
	 * @param obj 要保存的对象
	 * @return 返回的是插入数据的主键
	 */
	public Serializable save(Object obj) {
		// TODO Auto-generated method stub
		return sessionFactory.getCurrentSession().save(obj);
	}
	/**
	 * 更新一个对象到数据库
	 * @param obj
	 */
	public void update(Object obj) {
		// TODO Auto-generated method stub
		sessionFactory.getCurrentSession().update(obj);
	}
	/**
	 * 原始的分页方法
	 * @param hql 带问号的hql语句
	 * @param paras 给问号赋值的参数
	 * @param pageNow 当前页
	 * @param pageSize 当前页大小
	 * @return 返回查询到的当页数据List集合
	 */
	@SuppressWarnings("unchecked")
	public List findByPage(String hql,Object[] paras,int pageNow,int pageSize){
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		if(paras!=null&&paras.length!=0){
			for(int i=0;i<paras.length;i++){
				query.setParameter(i, paras[i]);
			}
		}
		query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
		query.setCacheable(true);
		return query.list();
	}
	/**
	 * 得到一个查询的行数
	 * @param hql 带问号的hql语句
	 * @param paras 给问号复制的参数
	 * @return 返回该查询的行数
	 */
	@SuppressWarnings("unchecked")
	public Long getCount(String hql,Object[] paras){
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		if(paras!=null&&paras.length!=0){
			for(int i=0;i<paras.length;i++){
				query.setParameter(i, paras[i]);
			}
		}
		query.setCacheable(true);
		List list=query.list();
		if(list.size()==1){
			return (Long) list.get(0);
		}
		return 0L;
	}
}

